package com.example.wangzh.developkit.widget;

import android.content.Context;
import androidx.appcompat.widget.AppCompatEditText;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;

/**
 * 要用setInputText()不能用setText不然有的时候会出现*号消失的情况
 */
public class IdcardEditText extends AppCompatEditText {
    String realText = "";
    boolean reset = false;

    public IdcardEditText(Context context) {
        this(context, null);
    }

    public IdcardEditText(Context context, AttributeSet attrs) {
        this(context, attrs, android.R.attr.editTextStyle);
    }

    public IdcardEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public String getRealText() {
        return realText.toString();
    }


    private void init() {
        TextWatcher editTextChangedListener = new TextWatcher() {
            //定义当前输入的字符数
            private int CharCount = 0;

            //s:变化后的所有字符
            public void afterTextChanged(Editable s) {
                //将光标点，移动到最后一个字
                setSelection(length());
            }

            //s:变化前的所有字符； start:字符开始的位置； count:变化的一段字符变化前的字符数；after:变化的一段字符变化后的字符数
//
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            //S：变化后的所有字符；start：字符起始的位置；before: 变化的一段字符变化前的字符数；count:变化的一段字符变化后的字符数
//            例：原来"123",输入一个"4"，s="1234",start=3,before=0;count=1
//                原来"1234",删除一个"4",s="123",stat=3,before=1,count=0
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // 讯飞输入法在英文输入模式时会预先将文字填入editText，
                // 然后点击完成按钮时又会填入重复的文字，它会在onTextChange前将重复的文字删除
                //用在该身份证输入框的时候，预先填入的文字会因为InputFilter的原因被过滤掉，
                // 点击完成按钮的时候填入的文字也会被过滤掉，结果onTextChanged前就会将不该删除的文字删除，
                // 导致onTextChanged传入的s不对
                //例英文输入模式时：
                //点击q,输入框填入q,点击完成，输入框qq，删去一个q，最终显示q
                //如果限制输入数字，先输入123，输入q,被过滤掉，输入框显示123，点击完成，填入q，被过滤掉，
                // 同时删去一位，最终onTextChange传入的参数为12
                //主要用来跳出循环，当改变文字时，onTextChanged就认为有所变化，会进入死循环，所以采用这种方式结束循环
                compareAndStore(s);
                if (CharCount != s.length()||reset) {
                    //将当前字符串的长度给输入字符串变量
                    CharCount = s.length();
                    //定义SpannableString，它主要的用途就是可以改变editText,TextView中部分文字的格式，以及向其中插入图片等功能
                    StringBuffer sb = new StringBuffer(s);
                    for (int i = 8; i < 14; i++) {
                        if (sb.length() >= i + 1) {
                            sb.replace(i, i + 1, "*");
                        }
                    }
                    reset = false;
                    setText(sb.toString());
                }
            }
        };
        addTextChangedListener(editTextChangedListener);
    }

    /**
     * 储存真实的身份证号
     *
     * @param s
     */
    private void compareAndStore(CharSequence s) {
        if (s == null) {
            return;
        }
        if (realText.length() > s.length()) {
            realText = realText.substring(0, s.length());
        }
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < realText.length(); i++) {
            if (s.charAt(i) != '*') {
                sb.append(s.charAt(i));
            } else {
                sb.append(realText.charAt(i));
            }
        }
        for (int i = realText.length(); i < s.length(); i++) {
            sb.append(s.charAt(i));
        }
        realText = sb.toString();
    }

    public void setInputText(String text) {
        reset = true;
        setText(text);
    }
}
